package LimitedTimeGame.Day_0226;

/**
 * @author zxc
 * @date 2023/02/26 10:02
 **/

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

/**
 * 题目 ：按奇偶性交换后的最大数字
 * 题目详述 ：
 * 给你一个正整数 num 。你可以交换 num 中 奇偶性 相同的任意两位数字（即，都是奇数或者偶数）。
 * 返回交换 任意 次之后 num 的 最大 可能值。
 *
 * 提示：
 * 1 <= num <= 109
 *
 */
public class LargestInteger {
    /**
     * 思路 ：
     * ===》
     * （1）首先，使用辅助数组dp（保存的数字位数 ：即，从低位到高位），去保存num中每一位上的数字;
     * （2）其次，拷贝辅助数组dp，得到temp数组，遍历temp数组（高位 ===》低位）;
     * （3）同时使用双指针p1 && p2，去指向dp数组中，奇数和偶数未被使用的最大值;
     * @param num
     * @return
     */
    public int largestInteger(int num) {
        // 获取数字num的总位数;
        int number = num;
        int len = 0;
        while(number > 0){
            len++;
            number /= 10;
        }
        // 低位 -> 高位，获取num中每个数位上的数字;
        int[] dp = new int[len];
        int k = 0;
        while(num > 0){
            dp[k++] = num % 10;
            num /= 10;
        }
        // 使用temp临时数组保存 对于数位进行排序后的;
        int[] temp = dp.clone();
        Arrays.sort(temp);

        int p1 = len - 1;
        int p2 = len - 1;
        int result = 0;
        // 遍历dp数组中所有元素
        for(int i = len - 1 ; i >= 0 ; i--){
            if(dp[i] % 2 == 0){
                while(p1 >= 0 && temp[p1] % 2 != 0){
                    p1--;
                }
                result = result * 10 + temp[p1--];
            }
            else if(dp[i] % 2 == 1){
                while(p2 >= 0 && temp[p2] % 2 != 1){
                    p2--;
                }
                result = result * 10 + temp[p2--];
            }
        }
        return result;
    }
}
